观察者和被观察者是存在耦合关系的
发布者和订阅者是完全解耦的，通过中间的调度中心
<script>
    // 观察者observer直接订阅主题subject，当subject被激活的时候会触发观察者observer里的事件
    //观察者模式由具体目标调度，每个被订阅的目标里面都需要有对观察者的处理，会造成代码的冗余。
     class Observer{
         constructor(name){
             this.name=name
         }
         update(price){
             console.log(this.name,price)
         }
     }
     class Subject{
         constructor(price){
             this.price=price
             this.observerList=[]
         }
         registerObserver(observer){
            this.observerList.push(observer)
         }
         notifyObserver(){
            this.observerList.forEach(observer=>observer.update(this.price))
         }
         setState(price){
             this.price=price
             if(price<=500){
                 this.notifyObserver()
             }
         }
     }
     const A=new Subject()
     const B=new Observer('B')
     A.registerObserver(B)
     setTimeout(()=>{
        A.setState(400)
     },3000)

     
</script>
<script>
    //发布订阅模式
    // 发布者只需告诉broker代理，我要发的消息，topic主题是AAA
    //订阅者只需告诉Broker代理，我要订阅topic主题是AAA的消息
    let HunterUnion={
        type:'hunt',
        topics:Object.create(null),
        subscribe(topic,fn){
            if(!this.topics[topic]){
                this.topics[topic]=[]
            }
            this.topics[topic].push(fn)
        },
        publish(topic,money){
            if(!this.topics[topic]){
                return
            }
            for(let fn of this.topics[topic]){
                fn(money)
            }
        }
    }
    function Hunter(name){
        this.name=name
    }
    Hunter.prototype.subscribe=function(topic,fn){
        console.log(this.name+'订阅了'+topic)
        HunterUnion.subscribe(topic,fn)
    }
    Hunter.prototype.publish=function(topic,money){
        console.log(this.name+'发布了'+topic)
        HunterUnion.publish(topic,money)
    }
    let hunterMing = new Hunter('小明')
    let hunterPeter = new Hunter('Peter')
    hunterMing.subscribe('tiger', function(money){
        console.log('小明表示：' + (money > 200 ? '' : '不') + '接取任务')
    })
    hunterPeter.publish('tiger',100)

</script>
